﻿using KELT;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

using KELT.KELTObjects.ViewportObjectModel;

namespace KELT.KELTObjects.LibraryObjectModel
{
    public class KELT_OBJ : INotifyPropertyChanged
    {
        /*
        protected string m_fileroot;  // 파일 경로 저장
        protected string m_filename;  // 파일 이름 저장

        protected float m_fHeight;      // 오브젝트 높이
        protected float m_fWidth;       // 오브젝트 너비 
        */
        // 만수
        #region 계층 구조
        protected KELT_OBJ parentObject;

        public string objectID { get; set; }
        public string objectName { get; set; }
        public string objectType { get; set; }

        private readonly ObservableCollection<KELT_OBJ> m_objectList;
        public ObservableCollection<KELT_OBJ> ObjectList
        {
            get { return m_objectList; }
        }

        public void addobject(KELT_OBJ obj)
        {
            m_objectList.Add(obj);
            obj.parentObject = this;
        }
        #endregion

        public KELT_OBJ()
        {
            m_objectList = new ObservableCollection<KELT_OBJ>();
            //m_AnimationList = new AnimationCollection();


        }

        #region ViewportObj
        protected ObservableCollection<ViewportObj> m_ViewpotTextObjectList = new ObservableCollection<ViewportObj>();      // 이미지 객체 저장 list

        public ObservableCollection<ViewportObj> viewportObjectList
        {
            get { return m_ViewpotTextObjectList; }
            set { m_ViewpotTextObjectList = value; }
        }
        public void addViewportObject(ViewportObj obj)
        {
            viewportObjectList.Add(obj);
        }
        public void removeViewportObject(ViewportObj obj)
        {
            viewportObjectList.Remove(obj);
        }
        #endregion

        // 더 이상 쓰지 않음
        #region Animation
        //private AnimationCollection m_AnimationList;
        //public AnimationCollection AnimationList
        //{
        //    get { return m_AnimationList; }
        //}

        //public void addAnimation(Animation ani)
        //{
        //    m_AnimationList.Add(ani);

        //    if (parentObject != null)
        //    {
        //        parentObject.addChildAnimation(ani);
        //    }
        //}

        //public void addChildAnimation(Animation ani)
        //{
        //    bool isInserted = false;

        //    foreach (var obj in m_AnimationList)
        //    {
        //        if (obj.StartTime > ani.EndTime)
        //        {
        //            break;
        //        }

        //        if (ani.StartTime < obj.EndTime && ani.EndTime > obj.StartTime)
        //        {
        //            if (ani.StartTime < obj.StartTime)
        //            {
        //                obj.StartTime = ani.StartTime;
        //            }

        //            if (ani.EndTime > obj.EndTime)
        //            {
        //                obj.EndTime = ani.EndTime;
        //            }

        //            isInserted = true;
        //        }
        //    }

        //    if (!isInserted)
        //    {
        //        addAnimation(ani);
        //    }

        //    if (parentObject != null)
        //        parentObject.addChildAnimation(ani);
        //}

        //public void removeAnimation(Animation ani)
        //{
        //    m_AnimationList.Remove(ani);

        //    if (parentObject != null)
        //    {
        //        parentObject.removeChildAnimation(ani);
        //    }
        //}
        //public void removeChildAnimation(Animation ani)
        //{
        //    if (parentObject != null)
        //        parentObject.removeChildAnimation(ani);
        //}

        #endregion 

        
        #region Set/Get
        /*
        public string FileRoot
        {
            // 파일 경로 반환 / 셋팅
            get { return m_fileroot; }
            set { m_fileroot = value; }
        }

        public string FileName
        {
            // 파일 이름 반환 / 셋팅
            get { return m_filename; }
            set { m_filename = value; }
        }

        public float Heigth
        {
            // 객체 높이 반환 / 셋팅
            get { return m_fHeight; }
            set { m_fHeight = value; }
        }

        public float Width
        {
            // 객체 너비 반환 / 셋팅
            get { return m_fWidth; }
            set { m_fWidth = value; }
        }
        */
        /*
        public float PosX
        {
            // 객체 x 좌표 반환 / 셋팅
            get { return m_fPosX; }
            set { m_fPosX = value; }
        }

        public float PosY
        {
            // 객체 y 좌표 반환 / 셋팅
            get { return m_fPosY; }
            set { m_fPosY = value; }
        }

        public float PosZ
        {
            // 객체 z 좌표 반환 / 셋팅
            get { return m_fPosZ; }
            set { m_fPosZ = value; }
        }

        public float Angle
        {
            // 객체 회전 값 반환 / 셋팅
            get { return m_fAngle; }
            set { m_fAngle = value; }
        }

        public string AnimationType
        {
            // 객체 애니메이션 타입 반환 / 셋팅
            get { return m_strAniType; }
            set { m_strAniType = value; }
        }
        */

        #endregion

        #region XML
        public virtual void GetObjXML(XmlWriter writer)
        {
            writer.WriteStartElement("KELTObj");
            writer.WriteAttributeString("objectID", objectID.ToString());
            writer.WriteAttributeString("objectName", objectName.ToString());
            writer.WriteAttributeString("objectType", objectType.ToString());
            {
                GetObjInfoXML(writer);
            }
            writer.WriteEndElement();
        }

        public virtual void GetObjInfoXML(XmlWriter writer)
        {

        }
        #endregion

        public void NotifyPropertyChanged(string PropertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}
